package s.k.gui.webtest.data.provider;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * 此工具类主要通过set注入的形式来使用，如果你不想导入poi包的话，你可以通过set注入的方式来注入到构造的对象中<br>
 *它的对象里面含有sheet，row，cell,cellRangeAddress的所有属性，可以直接调用poi包内的所有方法，也可以灵活的应用这个工具类的自<br>
 *身的方法来实现。提供的主要是get和set的方法，createCell的方法实现了一部分，就是在找不到cell的时候会自动的创建<br> 
 * 主要用来查询和调用Excel文件，对于创建的支持会在后续的时间逐渐的加入，因为poi对合并单元格的支持比较差，所以封装<br>
 * 几个得到合并单元格的方法和操作方法，有助于操作。<br>
 * 对于熟悉注入的人来说，这种方式应该很容易理解，但是对于java理解不深的人来说，可能这种方式有点难以理解。<br>
 * 为了降低耦合和降低类的数量我选择了这种方式。具体的会逐渐的加入和改进。<br>
 *
 * **/

public class ExcelDataTools {
		private Cell cell;
		private Row row;
		private Sheet sheet;
		private CellRangeAddress cellRange;
		private FileInputStream input;
		
//		public ExcelDataTools(Sheet sheet,Row row){
//			this.sheet=sheet;
//			this.row=row;
//		}
		public Cell getCell() {
			return cell;
		}
		public void setCell(Cell cell) {
			this.cell = cell;
		}
		public Row getRow() {
			return row;
		}
		public void setRow(Row row) {
			this.row = row;
		}
		public Sheet getSheet() {
			return sheet;
		}
		public void setSheet(Sheet sheet) {
			this.sheet = sheet;
		}
		public FileInputStream getInput() {
			return input;
		}
		public void setInput(FileInputStream input) {
			this.input = input;
		}
		/**得到office2003,2007Excel的工作平台，在流文件Input下*/
		public Workbook getExcel(FileInputStream input){
			try{
				return WorkbookFactory.create(input);
				
			}catch(IOException e){
				e.printStackTrace();
			}catch (InvalidFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}
		
		/**通过这个sheet对象得到它的名字*/
		public String getSheetName(){
			return sheet.getSheetName();
		}
		
		
		/**通过sheet这个对象得到它的序号------未实现*/
		public int getSheetIndex(Sheet sheet){
			return 0;
		}
		
		
		
		/**通过sheet的名字得到这个sheet*/
		public Sheet getSheet(String sheetName){
			return getExcel(input).getSheet(sheetName);
		}
		/**通过sheet的序号得到这个sheet，不从0开始计数，从1开始计数*/
		public Sheet getSheet(int sheetIndex){
			return getExcel(input).getSheetAt(sheetIndex);
		}
		/**通过row的序号得到row*/
		public Row getRow(int rowIndex){
			return sheet.getRow(rowIndex);
		}
		/**通过cell的序号得到cell*/
		public Cell getCell(int cellIndex){
			return row.getCell(cellIndex);
		}
		/**直接取得cell的值*/
		public Object getData() {
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
			//	System.out.println("取到的值是字符串，值为->"+cell.getStringCellValue());
				return cell.getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
		//		System.out.println("取到的值是布尔类型，值为->"+cell.getBooleanCellValue());
				return cell.getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
			//	System.out.println("取到的值是数字类型,值为->"+cell.getNumericCellValue());
				return cell.getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;		
		}
		/**得到某行的指定序号的cell的值*/
		public Object getData(int cellIndex) {
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
			//	System.out.println("取到的值是字符串，值为->"+row.getCell(cellIndex).getStringCellValue());
				return row.getCell(cellIndex).getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
			//	System.out.println("取到的值是布尔类型，值为->"+row.getCell(cellIndex).getBooleanCellValue());
				return row.getCell(cellIndex).getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
			//	System.out.println("取到的值是数字类型,值为->"+row.getCell(cellIndex).getNumericCellValue());
				return row.getCell(cellIndex).getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;
		}
		/**指定行的序号和指定的cell的序号得到cell内的数据，所有的row和cell都从1开始计数*/	
		public Object getData(int rowIndex, int cellIndex) {
			Cell cell = sheet.getRow(rowIndex).getCell(cellIndex);
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
			//	System.out.println("取到的值是字符串，值为->"+cell.getStringCellValue());
				return cell.getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
		//		System.out.println("取到的值是布尔类型，值为->"+cell.getBooleanCellValue());
				return cell.getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
			//	System.out.println("取到的值是数字类型,值为->"+cell.getNumericCellValue());
				return cell.getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;
		}
		/**指定sheet的名字，并且通过指定的row和cell的序号，得到cell内的值*/
		public Object getData(String sheetName, int rowIndex, int cellIndex) {
			Cell cell = getSheet(sheetName).getRow(rowIndex).getCell(cellIndex);
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
			//	System.out.println("取到的值是字符串，值为->"+cell.getStringCellValue());
				return cell.getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
				//System.out.println("取到的值是布尔类型，值为->"+cell.getBooleanCellValue());
				return cell.getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
			//	System.out.println("取到的值是数字类型,值为->"+cell.getNumericCellValue());
				return cell.getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;
		}
		/**指定sheet的序号，并且通过指定row和cell的序号，得到cell内的值*/
		public Object getData(int sheetIndex, int rowIndex, int cellIndex) {
			Cell cell = getSheet(sheetIndex).getRow(rowIndex).getCell(cellIndex);
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
				//System.out.println("取到的值是字符串，值为->"+cell.getStringCellValue());
				return cell.getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
				//System.out.println("取到的值是布尔类型，值为->"+cell.getBooleanCellValue());
				return cell.getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
				//System.out.println("取到的值是数字类型,值为->"+cell.getNumericCellValue());
				return cell.getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;
		}
		/**默认取第一个sheet内的指定row和cell序号的cell内的值*/
		public Object getDataByDefaultSheet(int rowIndex, int cellIndex) {
			Cell cell = getSheet(1).getRow(rowIndex).getCell(cellIndex);
			if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
				System.out.println("取到的值是字符串，值为->"+cell.getStringCellValue());
				return cell.getStringCellValue();	
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
				System.out.println("取到的值是布尔类型，值为->"+cell.getBooleanCellValue());
				return cell.getBooleanCellValue();
			}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
				System.out.println("取到的值是数字类型,值为->"+cell.getNumericCellValue());
				return cell.getNumericCellValue();
			}else{
				System.out.println("没有取到单元格内的值！");
			}
			return null;
		}
		
		/**
		 * 针对打开存在的EXCEL进行输入值设置，必须保证当前的单元格存在否则的话将会抛出空指针的异常，一般<br>
		 * 用来修改数据，可以输入各种类型的数据。
		 * 
		 * */
		
		/**直接针对cell进行值的设置，可以输入String，boolean，double等格式的数据
		 * */
		public void setValue(String value){
				cell.setCellValue(value);
		}
		public void setValue(boolean value){
			cell.setCellValue(value);
		}
		public void setValue(Date value){
			cell.setCellValue(value);
		}
		/**日程表的输入*/
		public void setValue(Calendar value){
			cell.setCellValue(value);
		}
		public void setValue(double value){
			cell.setCellValue(value);
		}
		public void setValue(RichTextString value){
			cell.setCellValue(value);
		}
		/***
		 * 通过对某一行内指定序号的单元格进行值的设置。
		 * */
		public void setValue(int cellIndex,String value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		public void setValue(int cellIndex,boolean value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		public void setValue(int cellIndex,Date value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		/**日程表的输入*/
		public void setValue(int cellIndex,Calendar value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		public void setValue(int cellIndex,double value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		public void setValue(int cellIndex,RichTextString value){
			if(cell==null)
				row.createCell(cellIndex);
			row.getCell(cellIndex).setCellValue(value);
		}
		/**
		 * 通过指定的row和cell的序号来设置cell内的值。
		 * */
		public void setValue(int rowIndex,int cellIndex,String value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int rowIndex,int cellIndex,boolean value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int rowIndex,int cellIndex,Date value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		/**日程表的输入*/
		public void setValue(int rowIndex,int cellIndex,Calendar value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int rowIndex,int cellIndex,double value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int rowIndex,int cellIndex,RichTextString value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		/**指定sheet的序号和row和cell的序号，来设置值*/
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,String value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,boolean value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,Date value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		/**日程表的输入*/
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,Calendar value){
			if((cell=sheet.getRow(rowIndex).getCell(cellIndex))==null){
				sheet.getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);;
		}
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,double value){
			if((cell=getSheet(sheetIndex).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetIndex).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(int sheetIndex,int rowIndex,int cellIndex,RichTextString value){
			if((cell=getSheet(sheetIndex).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetIndex).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		/**
		 * 
		 * 指定sheet的名字，通过row和cell的序号，来设置单元格的值*/
		public void setValue(String sheetName,int rowIndex,int cellIndex,String value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(String sheetName,int rowIndex,int cellIndex,boolean value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(String sheetName,int rowIndex,int cellIndex,Date value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		/**日程表的输入*/
		public void setValue(String sheetName,int rowIndex,int cellIndex,Calendar value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(String sheetName,int rowIndex,int cellIndex,double value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		public void setValue(String sheetName,int rowIndex,int cellIndex,RichTextString value){
			if((cell=getSheet(sheetName).getRow(rowIndex).getCell(cellIndex))==null){
				getSheet(sheetName).getRow(rowIndex).createCell(cellIndex);
			}
			cell.setCellValue(value);
		}
		
		/***得到指定名字的sheet下的所有的row的list*/
		public List<Row> getAllRows(String sheetName) {
			List<Row> rowList = new ArrayList<Row>();
			for(Iterator<Row> iter = getSheet(sheetName).rowIterator();iter.hasNext();){
				Row row = iter.next();
				rowList.add(row);
			}
			return rowList;
		}
		/**得到指定序号的sheet的所有的row的list*/
		public List<Row> getAllRows(int sheetIndex) {
			List<Row> rowList = new ArrayList<Row>();
			for(Iterator<Row> iter = getSheet(sheetIndex).rowIterator();iter.hasNext();){
				Row row = iter.next();
				rowList.add(row);
			}
			return rowList;
		}
		/**已知sheet得到这个sheet的所有的row的list*/
		public List<Row> getAllRows() {
			List<Row> rowList = new ArrayList<Row>();
			for(Iterator<Row> iter = sheet.rowIterator();iter.hasNext();){
				Row row = iter.next();
				rowList.add(row);
			}
			return rowList;
		}
		/**已知sheet的序号，得到这个sheet下所有的单元格的序列，从第一行开始取值到最后一行的最后一个单元格*/
		public List<Cell> getAllcells(int sheetIndex) {
			List<Cell> cellList = new ArrayList<Cell>();
			for(Iterator<Row> rowIter = getSheet(sheetIndex).rowIterator();rowIter.hasNext();){
				Row row = rowIter.next();
				for(Iterator<Cell> cellIter = row.cellIterator();cellIter.hasNext();){
					Cell cell = cellIter.next();
					cellList.add(cell);
				}
			}
			return cellList;
		}
		/**已知sheet的名字，得到这个sheet下所有的单元格是序列，从第一行开始取值一直到最后一行的最后一个单元格*/
		public List<Cell> getAllcells(String sheetName) {
			List<Cell> cellList = new ArrayList<Cell>();
			for(Iterator<Row> rowIter = getSheet(sheetName).rowIterator();rowIter.hasNext();){
				Row row = rowIter.next();
				for(Iterator<Cell> cellIter = row.cellIterator();cellIter.hasNext();){
					Cell cell = cellIter.next();
					cellList.add(cell);
				}
			}
			return cellList;
		}
		/**已知一个sheet，得到这个sheet下所有的单元格是序列，从第一行开始取值一直到最后一行的最后一个单元格*/
		public List<Cell> getAllcells() {
			List<Cell> cellList = new ArrayList<Cell>();
			for(Iterator<Row> rowIter = sheet.rowIterator();rowIter.hasNext();){
				Row row = rowIter.next();
				for(Iterator<Cell> cellIter = row.cellIterator();cellIter.hasNext();){
					Cell cell = cellIter.next();
					cellList.add(cell);
				}
			}
			return cellList;
		}
		/**已知一个row，得到这个row下面 的所有的cell的集合*/
		public List<Cell> getAllcellsByRow() {
			List<Cell> cellList = new ArrayList<Cell>();
			for(Iterator<Cell> cellIter = row.cellIterator();cellIter.hasNext();){
				Cell cell = cellIter.next();
				cellList.add(cell);
			}
			return cellList;
		}
		
		
		
		/**
		 *得到所有的合并单元格的数组 
		 * 
		 * */
		public CellRangeAddress[] getMergedRegion(){
			CellRangeAddress[] range = new CellRangeAddress[sheet.getNumMergedRegions()];
			for(int i=0;i<sheet.getNumMergedRegions();i++){
				range[i]=(CellRangeAddress)sheet.getMergedRegion(i);
			}
			return range;
		}
		
		/**判断一个区域是不是合并单元格，如果只是一个单元格返回false，如果是一个区域则返回true*/
		/**暂时没有太好的方法去判断，暂时放在这里。*/
		public boolean isRange(CellRangeAddress range){
			if(range.getLastRow()-range.getFirstRow()==0&&range.getLastColumn()-range.getFirstColumn()==0){
				return false;
			}
			return true;
		}
		
		/**得到某一列都是合并单元格的区域的集合*/
		public List<CellRangeAddress> getMergedRegionList(int cellIndex){
			List<CellRangeAddress> rangeList = new ArrayList<CellRangeAddress>();
			CellRangeAddress[] range = getMergedRegion();
			for(int i=0;i<range.length;i++){
				if(range[i].getLastColumn()==cellIndex&&range[i].getFirstColumn()==cellIndex){
					rangeList.add(range[i]);
				}
			}
			//rangeList=Arrays.asList(range);
			return rangeList;
		}

		public CellRangeAddress getCellRange() {
			return cellRange;
		}

		public void setCellRange(CellRangeAddress cellRange) {
			this.cellRange = cellRange;
		}
		
		
		
		/**
		 * 这个方法返回sheet中所有的具有内容的rows，如果row里面有一个单元格是空的话，就不会放在list中<br>
		 * @return 得到row的所有的带有数据的行，返回类型是Row
		 * 未想到合适的解决方法
		 * 主要解决excel表格有一些cell里面有空格字符，肉眼看不出来，容易干扰到测试的进行
		 * */
		public List<Row> getAllDataRows(){
			return null;
			
		}
		
		
		/**
		 * 一个辅助功能，能够帮助得到含有某个路径下面，含有文件名一定部分的文件全路径<br>
		 * @return只能返回第一个值
		 */
		public String getPathBycontains(String path,String contains){
			String str = null;
			File file = new File(path);
			File[] fileList = file.listFiles();
			for(int i=0;i<fileList.length;i++){
				//System.out.println(fileList[i]);
				if(fileList[i].toString().contains(path+contains)){
					str=fileList[i].toString();
			//		System.out.println("得到的是值为：");
					break;
				}
			}	
			return str;
		}
		
		
		
		
}
